﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DataAccessor
{
    /// <summary>
    /// 缓存所有Mapping
    /// </summary>
    public static class MappingCache
    {
        private static object _syncLock = new object();
        /// <summary>
        /// 获取Mapping文件的路径
        /// </summary>
        private static string MappingFilePath
        {
            get
            {
                var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"App_Data\T-SQL\Mapping.xml");

                if (File.Exists(path))
                {
                    return path;
                }
                else
                {
                    throw new FileNotFoundException(string.Format("{0}不存在.", path));
                }
            }
        }

        /// <summary>
        /// 开辟缓存区域
        /// </summary>
        private static MappingType[] _mappingTypeCollection;
        /// <summary>
        /// 获取所有模块的集合
        /// </summary>
        public static MappingType[] MappingTypeCollection
        {
            get { return _mappingTypeCollection; }
        }

        /// <summary>
        /// 获取指定Alias的类型配置映射信息。
        /// 如果具有多个相同Alias名称的配置则返回第一个。如果没有返回null。
        /// </summary>
        /// <param name="alias">别名</param>
        /// <returns>如果具有多个相同Alias名称的配置则返回第一个。如果没有返回null。</returns>
        public static MappingType Get(string alias)
        {
            return _mappingTypeCollection.SingleOrDefault(m => m.Alias == alias);
        }

        /// <summary>
        /// 静态构造函数，在调用类时初始化MappingCache对象
        /// </summary>
        static MappingCache()
        {
            lock (_syncLock)
            {
                if (_mappingTypeCollection == null)
                {
                    lock (_syncLock)
                    {
                        var _parser = new MappingParser(MappingFilePath);
                        _mappingTypeCollection = _parser.MappingType;
                    }
                }
            }
        }
    }
}
